package com.secure.handler;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;

import java.util.Map;

/**
 * 签名处理器
 * <p>
 * 验签由服务消费方提供实现
 */
public interface SignatureHandler {

    /**
     * 签名
     * <p>
     * 按照map里元素顺序组成k1=v1&k2=v2格式字符串进行签名
     *
     * @param plainMap   明文map
     * @param privateKey 私钥
     * @return
     * @throws Exception
     */
    String sign(Map<String, Object> plainMap, String privateKey);


    /**
     * 验签
     *
     * @param plainMap  明文map，需要转为k1=v1&k2=v2格式
     * @param signature 签名
     * @param publicKey 验签公钥
     * @throws Exception
     */
    boolean verify(Map<String, Object> plainMap, String signature, String publicKey);


    /**
     * map转k1=v1&k2=v2格式字符串
     * <p>
     * 按照map里元素顺序组成k1=v1&k2=v2格式
     * 里面不含签名
     * null值键值对去掉
     *
     * @param plainMap 明文map
     * @return
     */
    default String map2KeyValuePairText(Map<String, Object> plainMap) {
        if (CollectionUtil.isEmpty(plainMap)) {
            return null;
        }
        plainMap = JSONUtil.toBean(JSONUtil.toJsonStr(plainMap), JSONConfig.create().setIgnoreNullValue(true), Map.class);
        StringBuilder plainTextBuilder = new StringBuilder();
        for (Map.Entry<String, Object> entry : plainMap.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            if (ObjectUtil.isNotNull(value)) {
                String valueString = (ObjectUtil.isBasicType(value) || value instanceof String ? value.toString() : JSONUtil.toJsonStr(value));
                plainTextBuilder.append(key).append("=").append(valueString).append("&");
            }
        }
        return plainTextBuilder.substring(0, plainTextBuilder.length() - 1);
    }

}
